home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / lib / c / etc / RCS / mktemp.c,v < prev    next >
Text File  |  1989-05-18  |  3KB  |  147 lines

  1. head     1.2;
  2. branch   ;
  3. access   ;
  4. symbols  ;
  5. locks    ; strict;
  6. comment  @ * @;
  7.  
  8.  
  9. 1.2
  10. date     89.05.18.17.11.57;  author rab;  state Exp;
  11. branches ;
  12. next     1.1;
  13.  
  14. 1.1
  15. date     88.07.02.16.49.40;  author ouster;  state Exp;
  16. branches ;
  17. next     ;
  18.  
  19.  
  20. desc
  21. @@
  22.  
  23.  
  24. 1.2
  25. log
  26. @Added forward declarations for static functions.
  27. @
  28. text
  29. @/*
  30.  * Copyright (c) 1987 Regents of the University of California.
  31.  * All rights reserved.
  32.  *
  33.  * Redistribution and use in source and binary forms are permitted
  34.  * provided that this notice is preserved and that due credit is given
  35.  * to the University of California at Berkeley. The name of the University
  36.  * may not be used to endorse or promote products derived from this
  37.  * software without specific written prior permission. This software
  38.  * is provided ``as is'' without express or implied warranty.
  39.  */
  40.  
  41. #if defined(LIBC_SCCS) && !defined(lint)
  42. static char sccsid[] = "@@(#)mktemp.c    5.6 (Berkeley) 5/23/88";
  43. #endif /* LIBC_SCCS and not lint */
  44.  
  45. #include <sys/types.h>
  46. #include <sys/file.h>
  47. #include <sys/stat.h>
  48. #include <errno.h>
  49. #include <stdio.h>
  50. #include <ctype.h>
  51.  
  52. #define    YES    1
  53. #define    NO    0
  54.  
  55. static int _gettemp();
  56.  
  57. int
  58. mkstemp(as)
  59.     char    *as;
  60. {
  61.     int    fd;
  62.  
  63.     return (_gettemp(as, &fd) ? fd : -1);
  64. }
  65.  
  66. char *
  67. mktemp(as)
  68.     char    *as;
  69. {
  70.     return(_gettemp(as, (int *)NULL) ? as : (char *)NULL);
  71. }
  72.  
  73. static int
  74. _gettemp(as, doopen)
  75.     char    *as;
  76.     register int    *doopen;
  77. {
  78.     extern int    errno;
  79.     register char    *start, *trv;
  80.     struct stat    sbuf;
  81.     u_int    pid;
  82.  
  83.     pid = getpid();
  84.  
  85.     /* extra X's get set to 0's */
  86.     for (trv = as; *trv; ++trv);
  87.     while (*--trv == 'X') {
  88.         *trv = (pid % 10) + '0';
  89.         pid /= 10;
  90.     }
  91.  
  92.     /*
  93.      * check for write permission on target directory; if you have
  94.      * six X's and you can't write the directory, this will run for
  95.      * a *very* long time.
  96.      */
  97.     for (start = ++trv; trv > as && *trv != '/'; --trv);
  98.     if (*trv == '/') {
  99.         *trv = '\0';
  100.         if (stat(as, &sbuf) || !(sbuf.st_mode & S_IFDIR))
  101.             return(NO);
  102.         *trv = '/';
  103.     }
  104.     else if (stat(".", &sbuf) == -1)
  105.         return(NO);
  106.  
  107.     for (;;) {
  108.         if (doopen) {
  109.             if ((*doopen = open(as, O_CREAT|O_EXCL|O_RDWR, 0600)) >= 0)
  110.             return(YES);
  111.             if (errno != EEXIST)
  112.             return(NO);
  113.         }
  114.         else if (stat(as, &sbuf))
  115.             return(errno == ENOENT ? YES : NO);
  116.  
  117.         /* tricky little algorithm for backward compatibility */
  118.         for (trv = start;;) {
  119.             if (!*trv)
  120.                 return(NO);
  121.             if (*trv == 'z')
  122.                 *trv++ = 'a';
  123.             else {
  124.                 if (isdigit(*trv))
  125.                     *trv = 'a';
  126.                 else
  127.                     ++*trv;
  128.                 break;
  129.             }
  130.         }
  131.     }
  132.     /*NOTREACHED*/
  133. }
  134. @
  135.  
  136.  
  137. 1.1
  138. log
  139. @Initial revision
  140. @
  141. text
  142. @d27 3
  143. d45 1
  144. a45 1
  145. static
  146. @
  147.